package generic;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 定义泛型类,为了使程序有更好的通用性,使用泛型定义是一个不错的选择
 *
 * @param <T>
 */
public class Generic_01<T> {
    T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    /**
     * 我们还可以定义不受泛型类的泛型影响的,只使用于方法的单独的泛型
     *
     * @param e
     * @param <E>
     */
    public <E> void printData(E e) {
        System.out.println(e.toString());
    }

    /**
     * 定义带有返回值的泛型方法
     *
     * @param e1
     * @param <E>
     * @return
     */
    @SafeVarargs
    public final <E> E getMiddle(E... e1) {

        return e1[e1.length / 2];
    }

    //定义一个用于缓存数据的HashMap
    private final Map<String, Object> map = new HashMap<>();

    //存取缓存数据的方法
    public <V> List<V> getList(String key) {
        if (map.containsKey(key)) {
            return (List<V>) map.get(key);
        } else {
            List<V> list = new ArrayList<>();
            map.put(key, list);
            return list;
        }
    }

    public static void main(String[] args) {

        Generic_01<String> generic01 = new Generic_01<>();

        //方法使用
        generic01.<String>getList("data").add("hello world");
        System.out.println(generic01.getList("data").toString());


        //调用的时候使用<String>定义泛型,高版本的jdk可以省略
        generic01.<String>printData("hello world");
        System.out.println(generic01.<String>getMiddle("hello", "world"));


        generic01.setT("hello world");
        System.out.println(generic01.getT());


    }


}